/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package war;

import ejb.Notizia;
import ejb.GestoreNotiziaBeanLocal;
import ejb.Videogame;
import ejb.GestoreVideogameBeanLocal;
import ejb.Piattaforma;
import ejb.Utente;
import ejb.GestoreUtenteBeanLocal;
/*import ejb.Articolo;
import ejb.ArticoloFacadeLocal;
import ejb.Recensione;
import ejb.RecensioneFacadeLocal;
import ejb.GestoreArticoloBeanLocal;
import ejb.GestoreRecensioneBeanLocal;*/

import java.io.*;
import java.util.*;
import javax.ejb.EJB;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

/**
 *
 * @author allam
 */
@WebServlet(name = "Controller", urlPatterns = {"/Controller"})
public class Controller extends HttpServlet {
    //Variabili che fanno riferimento agli Enterprise Java Beans
    @EJB
    private GestoreUtenteBeanLocal gestoreUtenteBean;
    @EJB
    private GestoreVideogameBeanLocal gestoreVideogameBean;
    @EJB
    private GestoreNotiziaBeanLocal gestoreNotiziaBean;
    
    PrintWriter out;
    ServletContext sc;
    RequestDispatcher rd;
    HttpSession session;
    String azione;
    
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        out = response.getWriter();
        sc=getServletContext();
        rd=null;
        session=request.getSession();
             
        azione= request.getParameter("button");
        try{
            if(azione != null){
                if(azione.equals("aggiungiAdministrators")){
                        azioneAggiungiAdministrators(request, response);
                }
                else if (azione.equals("registrati")) {
		        azioneRegistrazione(request, response);
                        //aggiungiNotizia(request, response);
                }
                else if (azione.equals("registraUtente")) {
                        azioneRegistrazioneUtente(request, response);
                }
                else if (azione.equals("AggiungiRecensore")) {
                        azioneAggiungiRecensore(request, response);
                }
                else if (azione.equals("login")){
                        azioneLogin(request, response);
                }
                else if (azione.equals("logout")){
                        azioneLogout(request, response);
                }
                else if (azione.equals("modificaProfilo")){
                        azioneModificaUtente(request, response);
                }
                else if (azione.equals("mostraElencoUtenti")){
                        azioneMostraElencoUtenti(request, response);
                        //azioneMostraElencoUtentiCompleto(request, response);
                }
                else {
                        request.setAttribute("messageError","errore! valore button invalido");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request,response);
                }               
            }
        }
        catch(Exception e){
               request.setAttribute("messageError",e.getMessage());
               rd = sc.getRequestDispatcher("/error.jsp");
               rd.forward(request,response);
        }
        finally {
            out.close();
        }
    }
    private void azioneAggiungiAdministrators(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
            sc=getServletContext();
            rd=null;
            session = request.getSession(true);
            boolean administratorsAggiunti = false;
            if (!administratorsAggiunti){
            Utente utenteAttuale1 = gestoreUtenteBean.addAdministartor("nabil", "allam", "nabil_allam", "11", "nabil2802@gmail.com");
            Utente utenteAttuale2 = gestoreUtenteBean.addAdministartor("giuseppe", "saglia", "giuseppe_saglia", "22", "ultratoldo@gmail.com");
            Utente utenteAttuale3 = gestoreUtenteBean.addAdministartor("roberto", "cotrino", "roberto_cotrino", "33", "roberto.cotrino@gmail.com");
            Utente utenteAttuale4 = gestoreUtenteBean.addAdministartor("luca", "canensi", "luca_canensi", "44", "elcuchu1987@gmail.com");
            if ((utenteAttuale1 != null)&&(utenteAttuale2 != null)&&(utenteAttuale3 != null)&&(utenteAttuale4 != null)){
                    rd = sc.getRequestDispatcher("/home.jsp");
                    rd.forward(request,response);
            }
            else {
                    List <Utente> administrators = gestoreUtenteBean.mostraElenco("", "", "a");//va bene anche senza "a" siccome username e' univoco
                    //List <Utente> administrators = gestoreUtenteBean.trovaTutti();
                    List <String> usernames = new LinkedList<String>();
                    Utente a;
                    List <String> colletionUsers = new LinkedList<String>();
                    colletionUsers.add("nabil_allam");
                    colletionUsers.add("aaa");
                    colletionUsers.add("bbb");
                    colletionUsers.add("ddd");
                    for(int i = 0; i < administrators.size(); i++){
                        a = administrators.get(i);
                        usernames.add(a.getUsername());
                    }
                    if(usernames.containsAll(colletionUsers)){
                        rd = sc.getRequestDispatcher("/home.jsp");
                        rd.forward(request,response);
                    }
                    else{
                        request.setAttribute("messageError","inserimento administrators e' fallito");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request,response);
                    }        
           }   
            administratorsAggiunti = true;
        }
    }   
    /**
     * Redirege user alla pagina di registrazione
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneRegistrazione(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
            sc=getServletContext();
            rd=null;
            rd = sc.getRequestDispatcher("/register.jsp");// signup.jsp
            rd.forward(request,response);
    }
    /**
     *  Effettua la registrazione di un utente sul database
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneRegistrazioneUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc=getServletContext();
        rd=null;
        session = request.getSession(true);
        String nome = request.getParameter("nome");
        String cognome = request.getParameter("cognome");
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        String eMail = request.getParameter("eMail");
        String tipo = "u";
        Utente utenteAttuale = gestoreUtenteBean.addUtente(nome, cognome, username, pwd, eMail, tipo);

        if (utenteAttuale != null) {
            azioneLogin(request, response);
        }
        else {
            rd = sc.getRequestDispatcher("/register.jsp");
            rd.forward(request,response);
        }
    }
    private void azioneAggiungiRecensore(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc=getServletContext();
        rd=null;
        session = request.getSession(true);
        Utente utenteAttuale = (Utente)session.getAttribute("utente");
        if(utenteAttuale != null){
            if(utenteAttuale.getTipo().equals("a")){
                String nome = request.getParameter("nome");
                String cognome = request.getParameter("cognome");
                String username = request.getParameter("username");
                String pwd = request.getParameter("pwd");
                String eMail = request.getParameter("eMail");
                String tipo = "r";
                Utente recensore = gestoreUtenteBean.addUtente(nome, cognome, username, pwd, eMail, tipo);
                if (recensore != null) {
                    request.setAttribute("messageError","azione compiuta con successo");
                    rd = sc.getRequestDispatcher("/administrator.jsp");
                    rd.forward(request,response);
                }
                else {
                    request.setAttribute("messageError","Operazione non riuscita!inserimento recensore e' fallito");
                    rd = sc.getRequestDispatcher("/administrator.jsp");
                    rd.forward(request,response);
                }
            }
            else{
                request.setAttribute("messageError","Operazione non riuscita!non sei un administrator");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request,response);
            }
        }
        else{
                request.setAttribute("messageError","Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request,response);
        }
        
    }
    /**
     *  Effettua la modifica dei dati di un utente sul database
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneModificaUtente(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        sc=getServletContext();
        rd=null;
        session = request.getSession(true);
        Utente utenteAttuale = (Utente)session.getAttribute("utente");
        if(utenteAttuale != null){
                String nome = request.getParameter("nome");
                String cognome = request.getParameter("cognome");
                String oldpwd = request.getParameter("oldpwd");
                String newpwd = request.getParameter("pwd");
                String eMail = request.getParameter("eMail");
                String username = utenteAttuale.getUsername();
                String tipo = utenteAttuale.getTipo();
                Utente utenteAggiornato = gestoreUtenteBean.aggiorna(nome,cognome,username,oldpwd,newpwd,eMail,tipo);

                if (utenteAggiornato != null) {
                        session.setAttribute("utente", utenteAggiornato);
                        if(utenteAggiornato.getTipo().equals("a")){
                                rd = sc.getRequestDispatcher("/administrator.jsp");
                                rd.forward(request,response);
                        }
                        else if(utenteAggiornato.getTipo().equals("r")){
                                rd = sc.getRequestDispatcher("/reviewer.jsp");
                                rd.forward(request,response);
                        }
                        else{
                                rd = sc.getRequestDispatcher("/home.jsp");
                                rd.forward(request,response);
                        }
                }
                else {
                        request.setAttribute("messageError","Operazione non riuscita!La password specificata non e' corretta");
                        rd = sc.getRequestDispatcher("/error.jsp");
                        rd.forward(request,response);
                }
        }
        else{
                request.setAttribute("messageError","Operazione non riuscita!Non si dispone dei privilegi necessari per accedere alla pagina richiesta");
                rd = sc.getRequestDispatcher("/error.jsp");
                rd.forward(request,response);
        }
    }
    /**
     *  Effettua il login
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneLogin(HttpServletRequest request, HttpServletResponse response)  throws IOException, ServletException {
        HttpSession session = request.getSession();
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        
        Utente utenteAttuale = gestoreUtenteBean.login(username, pwd);
        if (utenteAttuale != null) {
            session.setAttribute("utente", utenteAttuale);
            if(utenteAttuale.getTipo().equals("a")){
                    rd = sc.getRequestDispatcher("/administrator.jsp");
                    rd.forward(request,response);
            }
            else if(utenteAttuale.getTipo().equals("r")){
                    rd = sc.getRequestDispatcher("/reviewer.jsp");
                    rd.forward(request,response);
            }
            else{
                    rd = sc.getRequestDispatcher("/home.jsp");
                    rd.forward(request,response);
            }
        }
        else {
            request.setAttribute("messageError","Operazione non riuscita! Username e/o password inseriti errati");
            rd = sc.getRequestDispatcher("/error.jsp");
            rd.forward(request,response);       
        }
    }
    /**
     *  Effettua il logout: la sessione corrente viene invalidata
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneLogout(HttpServletRequest request, HttpServletResponse response)  throws IOException, ServletException {
        HttpSession session = request.getSession();
        Enumeration attr = session.getAttributeNames();
        while (attr.hasMoreElements())
        session.removeAttribute((String)attr.nextElement());
        session.invalidate();
        rd = sc.getRequestDispatcher("/home.jsp");
        rd.forward(request,response);
    }
    /**
     *  Mostra l'elenco degli utenti
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneMostraElencoUtenti(HttpServletRequest request, HttpServletResponse response)  throws IOException, ServletException {
        session = request.getSession();
        String username = request.getParameter("username");
        String eMail = request.getParameter("eMail");
        String tipo = request.getParameter("tipo");
        if (username == null)
            username = "";
        if (eMail == null)
            eMail = "";
        if (tipo == null)
            tipo = "";
        
        List l = gestoreUtenteBean.mostraElenco(username, eMail, tipo);
        session.setAttribute("elencoUtenti", l);
        rd = sc.getRequestDispatcher("/elencoUtenti.jsp");
        rd.forward(request,response);   
    }
     /**
     *  Mostra l'elenco degli utenti
     * @param request servlet request
     * @param response servlet response
     */
    private void azioneMostraElencoUtentiCompleto(HttpServletRequest request, HttpServletResponse response)  throws IOException, ServletException {
        session = request.getSession();
        List l = gestoreUtenteBean.trovaTutti();
        session.setAttribute("elencoUtenti", l);
        rd = sc.getRequestDispatcher("/elencoUtenti.jsp");
        rd.forward(request,response);   
    }
    private void aggiungiNotizia(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try{
        Utente u = new Utente();
        Piattaforma p = new Piattaforma();
        List<Piattaforma> lista = new LinkedList ();
        lista.add(p);
        gestoreNotiziaBean.addNotizia("provaaaa", "behhd non so", u, Calendar.getInstance().getTime(),lista,"hhh");}
        catch(Exception e){
               request.setAttribute("messageError",e);
               rd = sc.getRequestDispatcher("/error.jsp");
               rd.forward(request,response);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    
}
